package cn.clx.ymcc.service.impl;

import cn.clx.ymcc.domain.Login;
import cn.clx.ymcc.dto.TokenRefreshDto;
import cn.clx.ymcc.mapper.LoginMapper;
import cn.clx.ymcc.result.JSONResult;
import cn.clx.ymcc.service.ILoginService;
import cn.clx.ymcc.util.AssertUtil;
import cn.clx.ymcc.util.HttpUtil;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.baomidou.mybatisplus.mapper.Wrapper;
import com.baomidou.mybatisplus.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;

import java.util.Map;

/**
 * <p>
 * 登录表 服务实现类
 * </p>
 *
 * @author clx
 * @since 2022-07-15
 */
@Service
public class LoginServiceImpl extends ServiceImpl<LoginMapper, Login> implements ILoginService {

    public final String TOKEN_URL = "http://localhost:10040/oauth/token?client_id=%s&client_secret=%s&grant_type=password&redirect_uri=http://www.baidu.com&username=%s&password=%s";

    public final String REFRESH_TOKEN_URL = "http://localhost:10040/oauth/token?grant_type=refresh_token&refresh_token=%s&client_id=%s&client_secret=%s";



    /**
     * 系统登录 统一认证服务，使用密码模式做统一认证
     * @param login
     * @return
     */
    @Override
    public JSONResult common(Login login) {
        //1.账号要存在
        Wrapper<Login> wrapper = new EntityWrapper<>();
        wrapper.eq("username",login.getUsername());
        Login loginTmp = selectOne(wrapper);
        AssertUtil.isNotNull(loginTmp,"用户不存在！！");
        //2.拼接请求，去使用密码模式换取token
        Integer type = login.getType();
        String clientId = "website";//客户端是主站
        String clientSecret = "123";
        if(type.intValue() == 0){//客户端是后台
            clientId = "admin";
            clientSecret="123";
        }
        //动态替换
        String url = String.format(TOKEN_URL,clientId,clientSecret,login.getUsername(),login.getPassword());
        String resultStr = HttpUtil.sendPost(url, null);

        //得到的token 封装返回一个map
        Map<String,Object> resutlMap = JSONObject.parseObject(resultStr, Map.class);
        //3.拿到值响应给前端，这里有两种情况，一种是成功获取token，一种是不成功，参数就是不相同的
        if(resutlMap.containsKey("error_description")){//获取token失败
            return JSONResult.error(resutlMap.get("error_description").toString());
        }else{
            //配置到多少时间过期
            Integer expires_in = (Integer)resutlMap.get("expires_in");//多少毫秒后过期
            resutlMap.put("expiresTime",System.currentTimeMillis() + expires_in);
            return JSONResult.success(resutlMap);
        }

    }

    /**
     * 登录token自动刷新过期
     * @param dto
     * @return
     */
    @Override
    public JSONResult refresh(TokenRefreshDto dto) {
        //1.账号要存在
        Wrapper<Login> wrapper = new EntityWrapper<>();
        wrapper.eq("username",dto.getUsername());
        Login loginTmp = selectOne(wrapper);
        AssertUtil.isNotNull(loginTmp,"用户不存在！！");

        String clientId = "admin";
        String clientSecret="123";

        //动态替换
        String url = String.format(REFRESH_TOKEN_URL,dto.getRefreshToken(),clientId,clientSecret);
        String resultStr = HttpUtil.sendPost(url, null);
        //得到新的token 封装返回一个map
        Map<String,Object> resutlMap = JSONObject.parseObject(resultStr, Map.class);
        //3.拿到值响应给前端，这里有两种情况，一种是成功获取token，一种是不成功，参数就是不相同的
        if(resutlMap.containsKey("error_description")){//获取token失败
            return JSONResult.error(resutlMap.get("error_description").toString());
        }else{
            //配置到多少时间过期
            Integer expires_in = (Integer)resutlMap.get("expires_in");//多少毫秒后过期
            resutlMap.put("expiresTime",System.currentTimeMillis() + expires_in);
            return JSONResult.success(resutlMap);
        }
    }

}
